package JDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
/*
PreparedStatement ：是statement 的子接口，是功能更强大的执行sql 语句对象
    1.statement 在执行sql 语句的时候有 sql 注入风险
    sql 注入是指 有一些关键字在拼接 SQL 语句的时候，会造成安全问题（例如：or, and 等）
    2.使用 PreparedStatement 解决SQL注入：
    预编译SQL 语句：使用 ？ 作为占位符，代替变量输入
    3.使用步骤：
        --获取数据库连接对象，
        --定义SQL语句：  SQL语句使用？ 占位符
            例如：select * from master where username =? and userpassword = ?
        --获取PreparedStatement 对象
            PreparedStatement = connection.prepareStatement(sql);
        --给占位符（？）赋值 PreparedStatement 对象可以处理数据库中的关键字和保留字
            setxxx(参数一，参数二) xxx表示数据类型
                参数一：表示给第几个？赋值，
                参数二：表示给 ？ 赋的 xxx类型的值
        --调用执行SQL语句的方法，不传参
        --处理结果
        --释放资源
面试题 PreparedStatement 和 statement 的作用和区别
PreparedStatement 和 statement ：都是用来执行SQL查询语句
PreparedStatement：使用 ？占位符，不会造成注入风险，
statement：使用字符拼接，会造成注入风险，
*/
public class Text_PreparedStatement extends JDBCUtil{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名：");
        String name = scanner.nextLine();
        System.out.println("请输入密码：");
        String password = scanner.nextLine();

        //获取数据库连接对象
        try {
            connection = JDBCUtil.getConnection();
            String sql = "select * from master where username=? and userpassword= ?";
            statement = connection.prepareStatement(sql);
            statement.setString(1,name);
            statement.setString(2,password);
             resultSet = statement.executeQuery();
             if (resultSet.next()){
                 System.out.println("登入成功......");
             }else {
                 System.out.println("登入失败~~~~~");
             }
            /*
             * 使用statement 执行 sql语句存在 sql 注入风险
             * */
            /* JDBCUtil.resultSet = statement.executeQuery(sql);
            if (JDBCUtil.resultSet.next()){

            }else {
                System.out.println("登入失败~~~~~");
            }*/
        } catch (Exception e) {
            e.printStackTrace();
        }finally {

            JDBCUtil.close(resultSet, statement, connection);

        }


    }
}
